﻿using SanlieHash;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace sametexts_u8
{
    public class TextCapsule
    {
        public static string tag(string text)
        {
            text = text.ToLower();
            {
                text = Regex.Replace(text, @"​​\p{P}​", "");
                var _text = new StringBuilder();
                foreach (var str in text)
                {
                    var _str = convert(str);
                    if (!char.IsPunctuation(_str)) _text.Append(_str);
                }
                text = Regex.Replace(_text.ToString(), @"\s+", "");
                text = Regex.Replace(text, @"[(（]", "");
                text = Regex.Replace(text, @"[）)]", "");
            }
            text = Regex.Replace(text, @"[o]", "0");
            text = Regex.Replace(text, @"[°c]", "℃");
            text = Regex.Replace(text, @"[*x×]", "x");
            text = Regex.Replace(text, @"[ΦФф]", "Ф");
            //std = Regex.Replace(std, @"[0O]", "[0O]");
            //std = Regex.Replace(std, @"[ΦФф()（）℃*xX]", "_");
            //std = Regex.Replace(std, @"°C", "_%");
            // 空格、括号 不计入计算
            // 相似字合并计算
            // 顺序排列
            if (string.IsNullOrEmpty(text)) return string.Empty;

            var hash = new Dictionary<string,int>();
            var hashmap = new List<string>();
            foreach (var str in text)
            {
                var key = FastHash.GetSM3(str+"");
                if (!hashmap.Contains(key))
                {
                    hashmap.Add(key);
                    hash.Add(key, 1);
                    continue;
                }
                hash[key]++;
            }
            var hashtag = new StringBuilder();
            foreach (var _h in hashmap.Order())
            {
                hashtag.Append(_h);
                hashtag.Append(hash[_h]);
            }
            return FastHash.GetSM3(hashtag.ToString());
        }
        internal static char convert(char c)
        {
            // 1) 全角空格
            if (c == '\u3000') return ' ';

            // 2) 全角 ASCII 变体（U+FF01..U+FF5E）-> 半角 ASCII（U+0021..U+007E）
            if (c is >= '\uFF01' and <= '\uFF5E') return (char)(c - '\uFEE0');

            // 3) 半角片假名字形（U+FF61..U+FF9F）-> 半角片假名（U+00A1..U+00DF）
            if (c is >= '\uFF61' and <= '\uFF9F') return (char)(c - '\uFF61' + '\u00A1');

            // 4) 常见全角标点 -> 英文标点
            return c switch
            {
                '\uFF0C' => ',',     // 全角逗号
                '\uFF1A' => ':',     // 全角冒号
                '\uFF1B' => ';',     // 全角分号
                '\uFF08' => '(',     // 全角左括号
                '\uFF09' => ')',     // 全角右括号
                '\uFF01' => '!',     // 全角叹号
                '\uFF1F' => '?',     // 全角问号
                '\u3001' => ',',     // 顿号 -> 半角逗号
                '\u3002' => '.',     // 句号
                '\uFF0E' => '.',     // 全角句点
                '\uFF1C' => '<',     // 全角小于
                '\uFF1E' => '>',     // 全角大于
                '\uFF5C' => '\\',    // 全角反斜杠
                '\uFF5E' => '~',     // 全角波浪
                '\uFFE0' => '\u00A2',// 全角分币符
                '\uFFE1' => '\u00A3',// 全角镑符
                '\uFFE5' => '\u00A5',// 全角日元符
                '\u2018' or '\uFF62' => '\u2018', // 单引弯引 -> 左单引号
                '\u2019' or '\uFF63' => '\u2019', // 单引直引 -> 右单引号
                '\u201C' or '\uFF02' => '\u201C', // 双引 -> 左双引号
                '\u201D' or '\uFF03' => '\u201D', // 双引 -> 右双引号
                '\u301D' => '\u201C', // 反引号类 -> 左双引号
                '\u301E' => '\u201D', // 反引号类 -> 右双引号
                '\uFF3B' => '[',     // 全角左方括号
                '\uFF3D' => ']',     // 全角右方括号
                '\uFF0F' => '/',     // 全角斜杠
                '\uFF0D' => '-',     // 全角连字符/减号
                '\uFF0B' => '+',     // 全角加号
                '\uFF0A' => '*',     // 全角星号
                '\uFF07' => '\'',    // 全角省略号? 实际为单引号 -> 半角单引号
                _ => c                // 其他字符（如汉字、Emoji）保持不变
            };
        }
    }
}
